'''
1.异常
    异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常
    没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止

    异常包含三个部分:
        1.异常的追踪信息 File "D:/python代码1/day7/异常.py", line 8, in <module>
        2.异常的类型     NameError
        3. 异常的信息   name 'a' is not defined
    错误分为两大类:
        1. 语法上的错误:在程序运行前就应该立即修正  这个好避免
        2. 逻辑上的错误:比如：字典没有key，你非要取key，
                            列表没有索引
                            变量没有名字  这些不好避免
2.为何要异常处理
    避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性

3. 如何异常处理
try:
    代码1
    代码2
    代码3
    ......
except NameError:
    当抛出的异常是NameError时执行的子代码块
except ....:
    pass
else:
    pass
finally:
    pass
'''
# def a():
#     print(111)
# a
# 异常处理的单分支
# try:
# #     a
# # except NameError as e:
# #     print('兄弟你检查一下代码')
# #     print(e)
# # else:
# #     # 程序没有抛出异常的时候执行
# #     print('代码正确')
# # finally:
# #     # 不管有错没错 一定会执行的部分
# #     print('完成了异常捕获')

# 常见异常
# print(1+'a') # TypeError
# print(1+)    # SyntaxError
# d = {'x':1,'y':2} # KeyError
# d['z']
# l = [1,2] # IndexError
# l[3]
# 异常处理的多分支
# try:
#     #a
#     print('=====1>')
#     print('=====1>')
#     print('=====1>')
#     l = [1, 2]  # IndexError
#     l[3]
# except NameError as e:
#     print(e)
# except IndexError as e:
#     print(e)
# else:
#     # 程序没有抛出异常的时候执行
#     print('代码正确')
# finally:
#     # 不管有错没错 一定会执行的部分
#     print('完成了异常捕获')

# 合并
# try:
#     # a
#     print('=====1>')
#     print('=====1>')
#     print('=====1>')
#     l = [1,2] # IndexError
#     l[3]
# except (NameError,IndexError,KeyError) as e:
#     print(e)
# else:
#     # 程序没有抛出异常的时候执行
#     print('代码正确')
# finally:
#     # 不管有错没错 一定会执行的部分
#     print('完成了异常捕获')

# 万能捕获
# try:
#     # d = {'x':1,'y':2} # KeyError
#     # d['z']
#     l = [1,2] # IndexError
#     l[3]
# except Exception as e:
#     print(e)
#     print('随便什么异常都可以')
# else:
#     # 程序没有抛出异常的时候执行
#     print('代码正确')
# finally:
#     # 不管有错没错 一定会执行的部分
#     print('完成了异常捕获')

# 判断文件是否存在
# 如果不存在创建
# try:
#     f = open('text1.txt','r')
# except:
#     print('你的文件没有创建')
#     f = open('text1.txt','w')
#     print('我帮你创建了')
# else:
#     print(f.read())
# finally:
#     f.close()

# 了解
# 断言
# print('=======111')
# # 自定义异常
# l = [1,2,3,4]
# # if len(l) !=5:
# #     raise TypeError('列表的长度必须为5，这是我的规则')
# assert len(l) == 5
#
# print('=======222')

# 1、自己构造一个报错的场景，并模仿课堂进行一个报错分析，报错的类型，报错的原因，报错的代码，和报错的行数（略）
# 2、结合异常处理，确保打开文件后的正常关闭。用open直接打开一个文件，然后write进行写入，假设在写入的时候可能会报错,
# 写段代码确保报错的情况下依然可以把文件关闭掉。
# f = open('text2.txt', 'w')
# try:
#     dic = {'name': 'dahai'}
#     f.write(dic['aaa'])
# except Exception as e:
#     print(e)
# finally:
#     f.close()
#     print('文件已关闭')
